// 在一个仓库里，有一排条形码，其中第 i 个条形码为 barcodes[i]。
// 请你重新排列这些条形码，使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案，此题保证存在答案。

// 示例 1：
// 输入：[1,1,1,2,2,2]
// 输出：[2,1,2,1,2,1]

// 示例 2：
// 输入：[1,1,1,1,2,2,3,3]
// 输出：[1,3,1,3,2,1,2,1]

// 提示：
//     1 <= barcodes.length <= 10000
//     1 <= barcodes[i] <= 10000

///////////先根据出现的数量排序，再按奇偶取值
/**`
 * @param {number[]} barcodes
 * @return {number[]}
 */
var rearrangeBarcodes = function(barcodes) {
    let countMap = new Map();
    barcodes.forEach(val => {
        if (countMap.has(val)) {
            countMap.set(val, countMap.get(val) + 1);
        } else {
            countMap.set(val, 1);
        }
    });
    let valueArr = Array.from(countMap.keys());
    valueArr.sort((a, b) => countMap.get(b) - countMap.get(a)); // 降序排序
    let arr = [];
    for(let i = 0; i < valueArr.length; i++) {
        let value = valueArr[i];
        let cnt = countMap.get(value);
        while(cnt > 0) {
            arr.push(value);
            cnt--;
        }
    }
    let result = [];
    let j = 0;
    for (let i = 0; i < barcodes.length; i += 2) {
        result[i] = arr[j++];
    }
    for (let i = 1; i < barcodes.length; i += 2) {
        result[i] = arr[j++];
    }
    return result;
};
console.log(rearrangeBarcodes([1,1,1,1,2,2,3,3]));

